#pragma once

#include "RBTree.h"

namespace w  
{
	template<class K>
	class set
	{
		typedef K ValueType;

		struct KeyOfValue
		{
			const K& operator()(const ValueType& data)
			{
				return data;
			}
		};

		typedef RBTree<K, ValueType, KeyOfValue> RBTree;
		typename typedef RBTree::const_iterator iterator;
		typename typedef RBTree::const_iterator const_iterator;
	public:
		set() : t() {}
		////////////////////////////
		// iterator: begin/end
		iterator begin() const{
			return t.begin();
		}
		iterator end() const{
			return t.end();
		}

		//////////////////////////////
		// capacity
		bool empty()const {
			return t == nullptr;
		}
		size_t size()const {
			size_t i = 0;
			for (auto& e : t) {
				i++;
			}
			return i;
		}
		///////////////////////////
		// modify
		pair<iterator, bool> insert(const ValueType& data) {
			return t.Insert(data);
		}
		void clear() {
			t.clear();
		}
		iterator find(const K& key) {
			return t.find(key);
		}
	private:
		RBTree t;
	};
}